package com.hsh.tools.convert;

import com.hsh.vo.result.convert.DbMenuListVO;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 该类用于递归构建树形菜单
 * https://blog.csdn.net/qq_42216791/article/details/107423990
 */
public class MenuTreeBuilder {

    // 构建某一字节的Tree菜单树
    public static List<DbMenuListVO> buildChild(List<DbMenuListVO> nodes, String childMenuId) {
        // 当前选择节点的树
        List<DbMenuListVO> rootMenu = new ArrayList<>();
        for (DbMenuListVO nav : nodes) {
            if (nav.getMenuId().equals(childMenuId)) {
                rootMenu.add(nav);
            }
        }
        // 根据Menu类的order排序
//        Collections.sort(rootMenu, DbMenuListVO.order());
        rootMenu.sort(DbMenuListVO.order());
        /*为根菜单设置子菜单，getChild是递归调用的*/
        for (DbMenuListVO nav : rootMenu) {
            // 获取根节点下的所有子节点 使用getChild方法
            List<DbMenuListVO> childList = getChild(childMenuId, nodes);
            // 给根节点设置子节点
            nav.setChildren(childList);
        }
        return rootMenu;
    }

    //*******************************如上获取子节点的子节点************************************************

    /**
     * 构建多级菜单树
     */
    public static List<DbMenuListVO> build(List<DbMenuListVO> nodes) {
        // 根节点
        List<DbMenuListVO> rootMenu = new ArrayList<>();
        for (DbMenuListVO nav : nodes) {
            // 表示只有为父节点才构建Tree树
            if (nav.getParentId() == 0) {
                rootMenu.add(nav);
            }
        }
        // 根据Menu类的order排序
        rootMenu.sort(DbMenuListVO.order());
        // 为根菜单设置子菜单，getChild是递归调用的
        for (DbMenuListVO nav : rootMenu) {
            // 获取根节点下的所有子节点 使用getChild方法
            List<DbMenuListVO> childList = getChild(nav.getMenuId(), nodes);
            // 给根节点设置子节点
            nav.setChildren(childList);
        }
        return rootMenu;
    }

    /**
     * 获取子菜单(根据根节点获取其子节点)
     */
    private static List<DbMenuListVO> getChild(String childMenuId, List<DbMenuListVO> nodes) {
        // 子菜单
        List<DbMenuListVO> childList = new ArrayList<DbMenuListVO>();
        for (DbMenuListVO nav : nodes) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            // 相等说明：为该根节点的子节点。
            if (nav.getParentId().equals(childMenuId)) {
                childList.add(nav);
            }
        }
        // 递归
        for (DbMenuListVO nav : childList) {
            nav.setChildren(getChild(nav.getMenuId(), nodes));
        }
        childList.sort(DbMenuListVO.order());//排序
        // 如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return Collections.emptyList();
        }
        return childList;
    }

    /**
     * tree转list
     */
    public static List<DbMenuListVO> treeToList(List<DbMenuListVO> menuVOList) {
        List<DbMenuListVO> result = new ArrayList<>();
        for (DbMenuListVO vo : menuVOList) {
            result.add(vo);
            List<DbMenuListVO> childMsg = vo.getChildren();
            if (childMsg != null && childMsg.size() > 0) {
                List<DbMenuListVO> entityList = treeToList(childMsg);
                result.addAll(entityList);
            }
        }
        if (result.size() > 0) {
            for (DbMenuListVO entity : result) {
                entity.setChildren(Collections.emptyList());
            }
        }
        return result;
    }

}
